/*
 * Паттерн Singleton
 * "Эталонная" реализация (Lazy Singleton)
 */
package patterns;

class SomeClassSingleton {
    
    //Заводим приватную статическую ссылку на объект нашего класса:
    private static SomeClassSingleton instance = null;

    //Объявляем приватный конструктор:
    private SomeClassSingleton() {
        System.out.println("I'm Singleton!");  
        try{
        throw new RuntimeException();
        }catch (RuntimeException e){
            e.printStackTrace();
        }finally{
        System.out.println("I'm alive!");
    }
    }
    //В синхронизированном методе получаем существующий объект, 
    //или создаем новый, если он еще не создан:
    public static synchronized SomeClassSingleton getInstance() {
        if (instance == null) {
            instance = new SomeClassSingleton();
        }
        return instance;
    }
}

public class SomeClass {
    public static void twoVyzov(){
        SomeClassSingleton.getInstance();
    }
    public static void main(String[] args) {
        //Объект создается, в конструкторе выводится сообщение:
        System.out.println("1");
        SomeClassSingleton.getInstance();
        System.out.println("2");
        //Второй раз конструктор не выполняется, сообщение не выводится:
        SomeClassSingleton.getInstance();
        System.out.println("3");
        twoVyzov();
        System.out.println("4");
    }
}